from Tkinter import *
from Referencia import *
from Consigna import *
from EncontrameSiPodes import *
from PartidaDeEncontrameSiPodes import *
from Solucion import *


class VisualizadorDePartidaDeEncontrameSiPodes:
	def __init__(self, partidaDeESP, root):

		self.__root = Frame(root)
		self.__root.pack(anchor=CENTER)

		self.__referencias = partidaDeESP.encontrameSiPodes().referencias()
		
		partidaDeESP.suscribirObservador( self )

		#Inicializacion de las palabras ingresadas

		# calculo el maximo corrimiento para alinear las palabras
		self.__maxCorrimiento = 0
		for referencia in self.__referencias:
			corrimiento = referencia.corrimiento()
			if corrimiento > self.__maxCorrimiento:
				self.__maxCorrimiento = corrimiento

		self.__respuestas = []
		self.__labels = []
		for referencia in self.__referencias:
			palabra = ""
			respuesta = referencia.consigna().respuesta()
			for char in respuesta:
				palabra = palabra + "-"

			frame = Frame(self.__root)
			frame.pack(anchor=W)

			espacioLabel = Label(frame, width=self.__maxCorrimiento - referencia.corrimiento() + 1, font=("Courier", 16))
			espacioLabel.pack(side=LEFT)

			palabraVar = StringVar()
			palabraVar.set(palabra)
			self.__respuestas.append(palabraVar)

			palabraLabel = Label(frame, width=len(referencia.consigna().respuesta()), font=("Courier", 16), textvariable=palabraVar)
			palabraLabel.pack(side=LEFT)
			self.__labels.append(palabraLabel)

		#Fin de las palabras ingresadas


		#Inicializacion de entrada de nueva palabra

		frameEntrada = Frame(self.__root)
		frameEntrada.pack(side=BOTTOM)

		listaOpciones = []
		for i in range(len(self.__referencias)):
			listaOpciones.append(str(i+1))

		self.__nroConsignaSeleccionada = StringVar()
		self.__nroConsignaSeleccionada.set(listaOpciones[0])
		menuNroConsigna = OptionMenu(frameEntrada, self.__nroConsignaSeleccionada, *listaOpciones)
		menuNroConsigna.pack(side=LEFT)

		self.__entradaSolucion = Entry(frameEntrada)
		self.__entradaSolucion.pack(side=LEFT)

		self.__botonIngresar = Button(frameEntrada, height=1, text="Ingresar solucion")
		self.__botonIngresar.pack(side=RIGHT)

		#Fin de entrada de nueva palabra


		#Inicializacion de las referencias

		labelTitulo = Label(text="Referencias:")
		labelTitulo.pack(side=TOP)

		for referencia in self.__referencias:
			ubicacion = str(referencia.ubicacion())
			enunciado = referencia.consigna().enunciado()
			labelEnunciado = Label(text=ubicacion + ". " + enunciado)
			labelEnunciado.pack(anchor=W, side=TOP)

		#Fin de la las referencias

		self.__labelTiempo = Label(text="0")
		self.__labelTiempo.pack(side=BOTTOM)

		#Boton Terminar Juego

		frameTerminar = Frame(self.__root)
		frameTerminar.pack(side=BOTTOM)
		self.__botonTerminarJuego = Button(frameTerminar, height=1, width=15, text="Terminar Juego", bg="Green")
		self.__botonTerminarJuego.pack(side=BOTTOM)

		#Fin boton terminar

	def setearControlador(self, controlador):
		def callback(d = (self)): 
			textoSolucion = self.__entradaSolucion.get().lower()
			self.__entradaSolucion.delete(0, END)
			ubicacionSolucion = int(self.__nroConsignaSeleccionada.get()) - 1
			solucion = Solucion(ubicacionSolucion, textoSolucion)
			controlador.seIngresoSolucion(solucion)
		
		self.__botonIngresar.config( command=callback )
		self.__botonTerminarJuego.config(command=controlador.seApretoBotonTerminar)

	def actualizarReloj(self, tiempo):
		self.__labelTiempo.config(text=str(tiempo))

	def deshabilitarBotonTerminar(self):
		self.__botonTerminarJuego.config(state=DISABLED)

	def deshabilitarBotonIngresar(self):
		self.__botonIngresar.config(state=DISABLED)

	def nuevaSolucion(self, solucion):
		self.__respuestas[solucion.ubicacion()].set(solucion.respuesta())

	def resultados(self, solucionesCorrectas, solucionesIncorrectas, puntaje):
		self.__mostrarResultados(solucionesCorrectas, solucionesIncorrectas, puntaje)

	def __mostrarResultados(self, solucionesCorrectas, solucionesIncorrectas, puntaje):
		for solucion in solucionesCorrectas:
			self.__labels[solucion.ubicacion()].config(bg="Green")
		for solucion in solucionesIncorrectas:
			self.__labels[solucion.ubicacion()].config(bg="Red")
		labelPuntaje=Label(text="Puntaje : " + str(puntaje))
		labelPuntaje.pack(side=BOTTOM)
